#!/usr/bin/env python
# -*- coding: UTF-8 -*-
'''
@Project ：django32_celery 
@File    ：configtest.py
@IDE     ：PyCharm 
@Author  ：Toby
@Date    ：2024/4/16 21:39 
'''

"""
scope:
    1、scope 默认是function，只要是函数都会运行
    2、class 类级别，每个函数都会运行一次
    3、session 整个作用域只运行一次
    4、module 整个py文件（模块）作用域只运行一次

autouse: 是否自动调用

"""
import requests
import json
import logging

logger = logging.getLogger(__name__)
import pytest
import configparser

from utilspakage import last_list_file
from utilspakage.django_email import YaGmail

'''
conftest.py是什么？ conftest.py是fixture函数的一个集合，可以理解为公共的提取出来放在一个文件里，
然后供其它模块调用。不同于普通被调用的模块，conftest.py使用时不需要导入，Pytest会自动查找 

conftest.py使用场景 
如果我们有很多个前置函数，写在各个py文件中是不很乱？再或者说，我们很多个py文件想要使用同一个前置函数该怎么办？这也就是conftest.py的作用


'''

Base_path = "/root/django32_celery/"
confg_path = Base_path + 'pytest.ini'
config_parm = configparser.ConfigParser()
config_parm.sections()
# 读取配置文件
config_parm.read(confg_path)


# fixture session 是在全部会话中使用, get_cookies可以做个一个参数带入到下面的test脚本的参数中,作为一个参数传入才能执行这个函数
# autouse=True：自动执行，默认False，开启为True后，将不需要主动调用也能使用
# 修改scope=“class”，在类的前后置
@pytest.fixture(scope="class", autouse=True)
def get_session():
    logger.info('<-------------------get_session ------------------->')

    sess = requests.Session()  # 创建一个session对象
    env = config_parm['token']['env']
    url = config_parm['token']['url']
    urladd = env + url
    data = {'mobile': config_parm['token']['mobile'], 'passwd': config_parm['token']['passwd'],
            'code': config_parm['token']['code'], 'wxType': config_parm['token']['wxType']
            }
    headers = {
        'Content-Type': 'application/x-www-form-urlencoded',
        'Connection': 'keep-alive',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
                      'Chrome/88.0.4324.104 Safari/537.36'
    }

    #
    se = sess.post(url=urladd, data=data, headers=headers)
    content = json.loads((se.content).decode())
    logger.error(content)
    sid = content['data']['sid']
    logger.info("se.content.sid--->{}".format(sid))

    st = sess.get(url=env + '/bp/getTokenBySid?sid=' + sid)
    tk = json.loads((st.content).decode())
    token = tk['data']
    logger.info(f"this is token:{token}")

    se_list = []
    se_list.append(sess)
    se_list.append(token)
    se_list.append(sid)

    return se_list


@pytest.fixture(scope='class',autouse=True)
def get_token_fixture():
    '''
    作用域  session ，返回token
    :return:
    '''
    headers = {
        'Content-Type': 'application/x-www-form-urlencoded',
        'Connection': 'keep-alive',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
                      'Chrome/88.0.4324.104 Safari/537.36'
    }
    _env = config_parm['token']['env']
    _url = config_parm['token']['url']
    url = _env + _url

    _data = {'mobile': config_parm['token']['mobile'], 'passwd': config_parm['token']['passwd'],
             'code': config_parm['token']['code'], 'wxType': config_parm['token']['wxType']
             }

    res = requests.post(url=url, headers=headers, data=_data).text
    res = json.loads(res)

    res2 = requests.get(url=_env + '/bp/getTokenBySid?sid=' + res['data']['sid']).text
    res2 = json.loads(res2)

    dt = {"userid": res['data']['userId'], 'appOpenid': res['data']['appOpenid'], 'userCode': res['data']['userCode'],
          'sid': res['data']['sid'], 'token': res2['data']}
    logger.info(dt)
    return dt


def pytest_unconfigure(config):  # pytest 中常见的hooks ，在所有测试用例执行完毕之后调用，可用来执行清理工作
    print("所有测试已经完成，现在可以进行一些清理工作,发送测试结果到邮箱中通知各位本次的测试结果。")

#     sender = config_parm['email']['sender']
#     receivers = (config_parm['email']['receivers']).split(',')
#     flag = config_parm['testchoose']['flag']
#     print(f'当前的flag：{flag}')
#     if flag == "0":
#         filepath_directory = Base_path + '/test_data'
#         lastfile = last_list_file.get_latest_file(filepath_directory)
#         # 发送测试结果 ，附件测试结果
#         sendemail = YaGmail(sender, receivers, lastfile)
#         sendemail.send()
#     else:
#         testname = Base_path + "/media/" + config_parm['testchoose']['scrlist']
#         # 发送测试结果 ，附件测试结果
#         print(sender, receivers)
#         sendemail = YaGmail(sender, receivers, testname)
#         sendemail.send()
#     # cfg.update_values('testchoose','flag',0)
#     config_parm['testchoose']['flag'] = "0"
